/**
 * iscroll extension using with jqm
 * @author Levin
 * @version 1.0
 */
JF.M("iscroll",(function($,S){

	var p={},pub={};

	p.iscroll={
		get:function(id){
			var j=this.cache.length;
			for(var i=j-1;i>=0;i--){
				if(this.cache[i].key===id){
					return this.cache[i];
				};
			};
			return null;
		},
		cache:[],
		setup:function(){
			var me=this;
			$(":jqmData(role='page')").bind("pageshow",function(){
				me.resolve($(this));
			});

			/* NOTE：经测试pagehide时销毁性能开销大 */
			/*
			$(":jqmData(role='page')").live("pagehide",function(){
				me.teardown();
			});
			*/

			//用户手工刷新页面 iscroll需要手工触发
			if($.mobile.activePage){
				me.resolve($.mobile.activePage);
			}
		},
		resolve:function($page){

			var $items=$page.find(":jqmData(iscroll='true')"),
				me=this;
			if($items.length==0) return;

			$items.each(function(i,o){
				var $i=$(this),
					id=this.id||("is-"+JF.RdStr(6)),
					obj=null;

				if(obj=me.get(id)) {
					obj.val.refresh();
					return;
				};

				if(!this.id){
					$i.attr("id",id);
				};

				var cfg=$i.jqmData("iscroll-cfg");
				cfg=cfg||{useTransition:true};
				
				if(cfg&&cfg.onPullUp){
					cfg.onPullUp_key=cfg.onPullUp;
					cfg.onPullUp=function(){
						var fun=eval('('+cfg.onPullUp_key+')').call(null);
						fun($i,function($obj,data,isError){
							/*
							setTimeout(function(){
								$obj.children(":eq(0)").append($obj.find('.iScrollPullUp'));
							},0);
							*/
							//$obj.children(":eq(0)").append($obj.find('.iScrollPullUp'));
							if(p.opts.navMGMT){
								$.mobile.navMGMT.bind("#"+id+" a");
							};
						});
						fun=null;
					};
				};
				
				if(cfg&&cfg.onPullDown){
					cfg.onPullDown_key=cfg.onPullDown;
					cfg.onPullDown=function(){
						var fun=eval('('+cfg.onPullDown_key+')').call(null);
						fun($i,function($obj,data,isError){
							/*
							setTimeout(function(){
								$obj.children(":eq(0)").prepend($obj.find('.iScrollPullDown'));
							},0);
							*/
							//$obj.children(":eq(0)").prepend($obj.find('.iScrollPullDown'));
							if(p.opts.navMGMT){
								$.mobile.navMGMT.bind("#"+id+" a");
							};
						});
						fun=null;
					};
				};

				if(cfg&&cfg.onScrollEnd){
					cfg.onScrollEnd_key=cfg.onScrollEnd;
					cfg.onScrollEnd=function(){
						eval('('+cfg.onScrollEnd_key+')').call(this,{target:$i});
					};
				};

				cfg.pullDownLabel= ['往前一页...', '松手加载数据...', '数据加载中...'];
				cfg.pullUpLabel= ['往后一页...', '松手加载数据...', '数据加载中...'];
				
				me._initPager($i,cfg);

				me.cache.push({
					key:this.id,
					val:new S(this.id,cfg),
					pID:$page[0].id
				});
			});
			$items=null;
		},//resolve
		teardown:function(){
			for(var i=this.cache.length-1;i>=0;i--){
				this.cache[i].val.destroy();
			};
			this.cache.length=0;

			return this;
		},
		/**
		 * 自动生成iscroll的分页dom
		 * @param {jQuery Object} $i 应用iScroll的dom对象
		 * @param {Object} cfg iscroll配置对象
		 */
		_initPager:function($i,cfg){
			if(!cfg) return;
			if(!cfg.pager) return;
			//已存在pager
			if($i.next().is("."+p.opts.clPager)) return;
			//获取页数
			var pNum=$i.find("li").length||$i.find("."+p.opts.clPager_item).length;
			if(pNum<2) return;

			var $p=null,
				isSysPager=true,
				onPagerAdd=p.opts.onPagerAdd||(function(idx){
					if(idx===0){
						this.append('<li class="'+p.opts.clPager_on+'">'+(idx+1)+'</li>');
					}else{
						this.append('<li>'+(idx+1)+'</li>');
					}
					
				});
			if(p.opts.onPagerUI){
				$p=p.opts.onPagerUI.call($i,cfg);
				isSysPager=false;
			};
			$p=$p||$('<ul/>');
			
			//生成页数的dom
			for(var j=0;j<pNum;j++){
				onPagerAdd.call($p,j);
			};

			if(isSysPager){
				$p=$('<div class="'+p.opts.clPager+' '+p.opts.clPager_xtra+'"/>').append($p);
			};

			$i.after($p);

			$p=null;
		}
	};

	//hack iscroll滚动加速功能。目前版本的iscroll滚动加速的加速速率没法配置
	p.hackMomentum=function(){
		var raw=iScroll.prototype._momentum;
		iScroll.prototype._momentum= function (dist, time, maxDistUpper, maxDistLower, size){
			var ret=raw.apply(this,[
				dist,
				time*p.opts.is_momentum_rate,
				maxDistUpper,
				maxDistLower,
				size
			]);
			return ret;
		};
	};

	/**
	 * 组件初始化，实现模块接口init
	 * @param {Object} opts 初始化配置项
	 */
	pub.init=function(opts){
		p.opts=$.extend({
			clPager:'iscr_pager',
			clPager_on:'c',
			clPager_xtra:'numbers',
			clPager_item:'p',
			onPagerUI:null,
			onPagerAdd:null,
			is_momentum_rate:0.6
		},opts||{});

		//p.hackMomentum();
	};
	/**
	 * 页面加载完毕的回调,实现模块接口onLoad
	 */
	pub.onLoad=function(){
		p.iscroll.setup();
	};

	pub.Get=$.proxy(p.iscroll.get,p.iscroll);

	return pub;

})(jQuery,iScroll));